#include "stm32f10x.h"                  // Device header
uint16_t ADValue[4];
void ADC_init(void)//单通道ADC初始化
{
	//初始化外设时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);//ADC外设时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//IO口外设时钟
	RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);//初始化DMA时钟
	RCC_ADCCLKConfig(RCC_PCLK2_Div6);//ADC时钟
	
	//初始化IO口
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;//模拟输入模式
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStructure);
		
	//配置AD
	
	ADC_RegularChannelConfig(ADC1,ADC_Channel_0,1,ADC_SampleTime_55Cycles5);//规则组频道设置
	ADC_RegularChannelConfig(ADC1,ADC_Channel_1,2,ADC_SampleTime_55Cycles5);//规则组频道设置
	ADC_RegularChannelConfig(ADC1,ADC_Channel_2,3,ADC_SampleTime_55Cycles5);//规则组频道设置
	ADC_RegularChannelConfig(ADC1,ADC_Channel_3,4,ADC_SampleTime_55Cycles5);//规则组频道设置
	
	ADC_InitTypeDef ADC_InitStructure;
	ADC_InitStructure.ADC_ContinuousConvMode=ENABLE;//连续转换
	ADC_InitStructure.ADC_Mode=ADC_Mode_Independent;//只测量一个口的
	ADC_InitStructure.ADC_ScanConvMode=ENABLE;	//扫描模式
	ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;//数据右对齐
	ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;//非外部触发转换
	ADC_InitStructure.ADC_NbrOfChannel=4;
	ADC_Init(ADC1,&ADC_InitStructure);

	
	//初始化DMA
    DMA_InitTypeDef DMA_InitStructure;
	DMA_InitStructure.DMA_PeripheralBaseAddr=(uint32_t)&ADC1->DR;//指定外设基地址
	DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_HalfWord;//指定外设数据长度
	DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable;//外设地址不自增
	DMA_InitStructure.DMA_MemoryBaseAddr=(uint32_t)ADValue;//指定存储器基地址
	DMA_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_HalfWord;//指定存储器数据长度
	DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable;//存储器地址自增
	DMA_InitStructure.DMA_BufferSize=sizeof(ADValue)/sizeof(ADValue[0]);//指定待转运数据个数
	DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralSRC;//指定方向：从外设搬运至存储器
	DMA_InitStructure.DMA_M2M=DMA_M2M_Disable;//选择“外设到存储器”传输，也即硬件触发
	DMA_InitStructure.DMA_Mode=DMA_Mode_Circular;//DMA自动循环模式
	DMA_InitStructure.DMA_Priority=DMA_Priority_Medium;//设置优先级
    DMA_Init(DMA1_Channel1,&DMA_InitStructure);//DMA初始化完成
	
	ADC_DMACmd(ADC1,ENABLE);//使能ADC触发DMA
	DMA_Cmd(DMA1_Channel1,ENABLE);//DMA上电
	ADC_Cmd(ADC1,ENABLE);//ADC上电
	
	//ADC校准
	ADC_ResetCalibration(ADC1);//复位校准功能
	while( ADC_GetResetCalibrationStatus(ADC1)==SET )//等待复位完成
		                  ;
	ADC_StartCalibration(ADC1);//开始校准
	while( ADC_GetCalibrationStatus(ADC1)==SET )//等待校准完成
		                  ; 	

	ADC_SoftwareStartConvCmd(ADC1, ENABLE);//需要软件启动一次ADC
}






